// File: semaphor.h
#ifndef  __SEMAPHOR_H__
#define  __SEMAPHOR_H__
#include  "thread.h"
#include  "kernsem.h"
/** 
 * @brief Ova bool promenljiva odredjuje da li ce se vrsiti preempting za svaki
 * poziv nad sihronizacionim primitivama.
 */
extern int semPreempt;

class KernelSem;

class Semaphore {
    public:
        Semaphore (int init=1);
        ~Semaphore ();
        /** 
         * @brief Nit se blokira nad datim semaforom ako je vrednost semafora
         * manja ili jednaka nuli.
         * 
         * @param time
         * Zadaje vremensko ogranicenje blokiranosti niti nad datim semaforom.
         * Ako je zadata vrednost 0, onda je u pitanju neograniceno cekanje.
         *  
         * @return
         * 0 - Ako smo odblokirali nit sa signal() pozivom, ili nikad nije bila blokirana.
         * 1 - Ako je nit odblokirana zbog isteka vremena.
         * 2 - Ako smo eksplicitno trazili da se data nit odblokira sa
         *     Thread::Interrupt() pozivom
         */
        virtual int wait  (Time time);
        /** 
         * @brief Odblokira niti koje cekaju na semaforu, i uvecava vrednost
         * semafora
         */
        virtual void signal();
        /** 
         * @brief Vraca trenutnu vrednost semafora
         * 
         * Ako zelimo "tacnu" vrednost, mora biti pozvana izmedju
         * lock()&unlock() primitiva
         */
        int val () const;  // Returns the current value of the semaphore
    private:
        KernelSem* myImpl;
};

#endif  /*__SEMAPHOR_H__*/
